#include "ijkmediaplayer.h"

IjkMediaPlayer::IjkMediaPlayer()
{

}

IjkMediaPlayer::~IjkMediaPlayer()
{

}

int IjkMediaPlayer::ijkmp_create(std::function<int (void *)> msg_loop)
{
    // 方法返回值
    int ret = 0;
    // 创建真正的播放器
    ffplay_ = new FFplay();
    if(!ffplay_)
    {
        std::cout << "new FFplay() failed\n";
    }
    // 调用create方法创建内部参数
    ret = ffplay_->ffp_create();
    if(ret < 0)
    {
        std::cout << "ffp_create() failed\n";
        return -1;
    }
    // 接收消息处理函数
    msg_loop_l = msg_loop;

}

int IjkMediaPlayer::ijkmp_stop()
{
    int ret = ffplay_->ffp_stop();
    return ret;
}

int IjkMediaPlayer::ijkmp_destroy()
{
    ffplay_->ffp_destroy();
    return 0;
}

int IjkMediaPlayer::ijkmp_set_data_source(const char *url)
{
    if(!url)
    {
        return -1;
    }
    // 分配内存 + 拷贝字符串
    data_source_ = strdup(url);
    return 0;
}

int IjkMediaPlayer::ijkmp_prepare_async()
{
    // 判断mp的状态
    // 设置状态为正在准备中
    mp_state_ = MP_STATE_ASYNC_PREPARING;
    // 启动消息队列
    msg_queue_start(&ffplay_->msg_queue_);
    // 创建循环线程
    msg_thread_ = new std::thread(&IjkMediaPlayer::ijkmp_msg_loop, this, this);
    // 调用ffplay
    int ret = ffplay_->ffp_prepare_async_l(data_source_);
    if(ret < 0)
    {
        mp_state_ = MP_STATE_ERROR;
        return -1;
    }
    return 0;
}

int IjkMediaPlayer::ijkmp_msg_loop(void *arg)
{
    // 调用循环处理消息的方法
    msg_loop_l(arg);
    return 0;
}

int IjkMediaPlayer::ijkmp_get_msg(AVMessage *msg, int block)
{
    while(1)
    {
        // 是否继续获取下一条消息【因为本条消息对于msg_loop来说可能没用，那么在这里就给他删除掉，然后获取下一条消息】
        int continue_wait_next_msg = 0;
        // 从消息队列中获取消息
        int ret = msg_queue_get(&ffplay_->msg_queue_, msg, block);
        // 如果消息队列已经停止
        if(ret < 0)
        {
            return ret;
        }
        switch(msg->type) {
        case FFP_MSG_FLUSH:
        {
            std::cout << __FUNCTION__ << ": FFP_MSG_FLUSH\n";
            break;
        }
        // 本条消息再通知操作ffplay，即这里相当于是两个中转站，UI <- ijkmp_get_msg -> ffplay
        case FFP_MSG_START:
        {
            std::cout << __FUNCTION__ << ": FFP_MSG_START\n";
            continue_wait_next_msg = 1;
            // todo：调用ffplay->start
            // ffplay_->start();
            break;
        }
        default:
            std::cout << __FUNCTION__ << ": defalut " << msg->type << "\n";
        }
        // 如果本条消息不需要发给UI，那么再次获取下一条消息
        if(continue_wait_next_msg)
        {
            msg_free_obj(msg);
            continue;
        }
        // 如果这条消息需要发给UI，那么直接发给UI
        return ret;
    }
    return -1;
}

void IjkMediaPlayer::ijkmp_start()
{
    std::cout << "ijkmp_start\n";
    msg_queue_put_simple1(&ffplay_->msg_queue_, FFP_MSG_START);
}
